package com.aust.proxy;

/**
 * 静态代理模式总结：
 * 1.真实对象与代理对象都要实现同一个接口
 * 2.代理对象要代理真实角色
 * 代理对象调用真实对象的方法并将真实对象加入代理对象
 * 通过代理对象对真实对象进行操作
 * 真实对象完成具体的功能，代理对象在真实对象的基础上对其进行扩充
 */
public class StaticProxy {
    public static void main(String[] args) {
        WeddingCompany weddingCompany = new WeddingCompany(new YoungMarry());
        weddingCompany.HappyMarry();
    }
}

/**
 * | 接口（Subject）         | 定义目标对象和代理对象都必须实现的方法         |
 * | 真实对象（RealSubject）  | 实际业务逻辑的实现者                       |
 * | 代理对象（ProxySubject） | 控制访问真实对象，在调用前后添加操作          |
 */

/**
 * 静态代理是一种基础但非常重要的设计模式
 * 用于在不修改原有代码的前提下增强功能
 * 虽然灵活性不如动态代理，但在小项目或学习阶段非常实用
 * 动态代理是在它的基础上更进一步的升级版
 */
interface Marry {
    /**
     * 人间四大喜事：
     * 久旱逢甘露
     * 他乡遇故知
     * 洞房花烛夜
     * 金榜题名时
     */
    void HappyMarry();
}

/**
 * 真实角色
 */
class YoungMarry implements Marry {
    @Override
    public void HappyMarry() {
        System.out.println("Happy Marry");
    }
}

/**
 * 代理角色
 */
class WeddingCompany implements Marry {

    /**
     * 代理真实目标
     */
    private Marry target;

    public WeddingCompany(Marry target) {
        this.target = target;
    }

    @Override
    public void HappyMarry() {
        before();
        /**
         * 真实对象
         */
        target.HappyMarry();
        after();
    }

    private void before() {
        System.out.println("婚前");
    }

    private void after() {
        System.out.println("婚后");
    }
}